﻿using Library.AppWeb;
using MPR.Poker.DALEntity.SYS;
using MPR.Poker.Model.LIS;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MPR.Poker.DALEntity.LIS
{
    public class DAL_Prize
    {
        public DAL_Prize()
        {
        }

        #region Insert/Update/Delete

        /// <summary>
        /// Thêm Xếp loại giải thưởng
        /// </summary>
        /// <param name="objPrize"></param>
        /// <returns></returns>
        public ResultMessage Insert(LIS_Prize objPrize)
        {
            ResultMessage objResultMessage = new ResultMessage();
            objResultMessage = CheckExist(objPrize);
            if (objResultMessage.IsError) return objResultMessage;

            objResultMessage = InsertNoCheck(objPrize);

            return objResultMessage;
        }

        /// <summary>
        /// Kiểm Tra Xếp loại giải thưởng Đã Tồn Tại
        /// </summary>
        /// <param name="strIDSys"></param>
        /// <param name="strPrizeID"></param>
        /// <returns></returns>
        public ResultMessage CheckExist(LIS_Prize objPrize)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                //using (PokerLife db = new PokerLife())
                //{
                //    LIS_Prize Prize = db.LIS_Prizes.FirstOrDefault(i => i.IsDeleted == false & i.PrizeID == objPrize.PrizeID & i.IDSys != objPrize.IDSys);

                //    if (Prize != null && Prize.IDSys > 0)
                //    {
                //        objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.No_Error, "Xếp loại giải thưởng đã tồn tại", string.Empty);
                //    }
                //}
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.CheckData, "Lỗi kiểm tra tồn tại Xếp loại giải thưởng", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Prize --> CheckExist");
                return objResultMessage;
            }
            return objResultMessage;
        }

        /// <summary>
        /// Thêm mới Xếp loại giải thưởng chưa kiểm tra tồn tại
        /// </summary>
        /// <param name="objPrize"></param>
        /// <returns></returns>
        public ResultMessage InsertNoCheck(LIS_Prize objPrize)
        {
            ResultMessage objResultMessage = new ResultMessage();
            LIS_Prize Prize = new LIS_Prize();

            try
            {
                using (PokerLife db = new PokerLife())
                {
                    
                    Prize.PrizeName = objPrize.PrizeName;
                    Prize.StepIncrease = objPrize.StepIncrease;
                    Prize.AwardValue = objPrize.AwardValue;
                    Prize.TournamentIDSys = objPrize.TournamentIDSys;
                    Prize.TournamentStepIDSys = objPrize.TournamentStepIDSys;
                    Prize.Note = objPrize.Note;
                    Prize.OrderIndex = db.LIS_Prizes.Count() + 1;
  
                    db.LIS_Prizes.Add(Prize);
                    db.SaveChanges();
                }

                objPrize.IDSys = Prize.IDSys;
                DataCache.ClearDataCache.PrizeCache();
                DAL_Event.Insert("Thêm mới Xếp loại giải thưởng - " + objPrize.PrizeName.ToString(), 0, ResultMessage.ErrorTypes.Insert.ToString());
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.Insert, "Lỗi thêm mới Xếp loại giải thưởng", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Prize --> Insert");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Thêm mới Xếp loại giải thưởng thành công", string.Empty);
        }

        /// <summary>
        /// Cập nhật Xếp loại giải thưởng
        /// </summary>
        /// <param name="objPrize"></param>
        /// <returns></returns>
        public ResultMessage Update(LIS_Prize objPrize)
        {
            ResultMessage objResultMessage = new ResultMessage();
            objResultMessage = CheckExist(objPrize);
            if (objResultMessage.IsError) return objResultMessage;

            objResultMessage = UpdateNoCheck(objPrize);

            return objResultMessage;
        }

        /// <summary>
        /// Cập nhật Xếp loại giải thưởng chưa kiểm tra tồn Tại
        /// </summary>
        /// <param name="objPrize"></param>
        /// <returns></returns>
        public ResultMessage UpdateNoCheck(LIS_Prize objPrize)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {

                    LIS_Prize Prize = db.LIS_Prizes.FirstOrDefault(i => i.IDSys == objPrize.IDSys);
                    Prize.PrizeName = objPrize.PrizeName;
                    Prize.StepIncrease = objPrize.StepIncrease;
                    Prize.AwardValue = objPrize.AwardValue;
                    Prize.TournamentIDSys = objPrize.TournamentIDSys;
                    Prize.TournamentStepIDSys = objPrize.TournamentStepIDSys;
                    Prize.Note = objPrize.Note;

                    db.SaveChanges();
                }
                DataCache.ClearDataCache.PrizeCache();
                DAL_Event.Insert("Cập nhật Xếp loại giải thưởng - " + objPrize.PrizeName.ToString(),0, ResultMessage.ErrorTypes.Update.ToString());
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.Update, "Lỗi cập nhật Xếp loại giải thưởng", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Prize --> Update");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Cập nhật Xếp loại giải thưởng thành công", string.Empty);
        }

        /// <summary>
        /// Xóa Xếp loại giải thưởng
        /// </summary>
        /// <param name="strIDSys"></param>
        /// <returns></returns>
        public ResultMessage Delete(LIS_Prize objPrize)
        {
            ResultMessage objResultMessage = new ResultMessage();
            objResultMessage = CheckRelationship(objPrize);
            if (objResultMessage.IsError) return objResultMessage;

            objResultMessage = DeleteNoCheck(objPrize);

            return objResultMessage;
        }

        /// <summary>
        /// Xóa đơn vị tiền tệ
        /// </summary>
        /// <param name="intPrizeIDSys">Mã hệ thống đơn vị tiền tệ</param>
        /// <param name="intDeletedUser">Mã người dùng</param>
        /// <returns></returns>
        public ResultMessage Delete(int intPrizeIDSys, int intDeletedUser)
        {
            ResultMessage objResultMessage = new ResultMessage();
            LIS_Prize objPrize = new LIS_Prize();
            objPrize.IDSys = intPrizeIDSys;

            objResultMessage = CheckRelationship(objPrize);
            if (objResultMessage.IsError) return objResultMessage;

            objResultMessage = DeleteNoCheck(objPrize);

            return objResultMessage;
        }

        /// <summary>
        /// Xóa đơn vị tiền tệ
        /// </summary>
        /// <param name="lstPrizeIDSys">Danh sách mã hệ thông đơn vị tiền tệ</param>
        /// <param name="intDeletedUser"></param>
        /// <returns></returns>
        public ResultMessage Delete(List<int> lstPrizeIDSys, int intDeletedUser)
        {
            ResultMessage objResultMessage = new ResultMessage();
            foreach (int intIDSys in lstPrizeIDSys)
            {
                LIS_Prize objPrize = new LIS_Prize();
                objPrize.IDSys = intIDSys;

                objResultMessage = CheckRelationship(objPrize);
                if (objResultMessage.IsError) return objResultMessage;

                objResultMessage = DeleteNoCheck(objPrize);
                if (objResultMessage.IsError) return objResultMessage;
            }
            return objResultMessage;
        }

        /// <summary>
        /// Kiểm tra dữ liệu liên quan
        /// </summary>
        /// <param name="strIDSys"></param>
        /// <returns></returns>
        public ResultMessage CheckRelationship(LIS_Prize objPrize)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
               

            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.CheckData, "Lỗi kiểm tra dữ liệu liên quan Xếp loại giải thưởng", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Prize --> CheckRelationship");
                return objResultMessage;
            }
            return objResultMessage;
        }

        /// <summary>
        /// Xóa Xếp loại giải thưởng chưa kiểm tra dữ liệu liên quan
        /// </summary>
        /// <param name="strIDSys"></param>
        /// <returns></returns>
        public ResultMessage DeleteNoCheck(LIS_Prize objPrize)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    LIS_Prize Prize = db.LIS_Prizes.FirstOrDefault(i => i.IDSys == objPrize.IDSys);
                    if (Prize == null || Prize.IDSys == 0)
                    {
                        objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.No_Error, "Xếp loại giải thưởng không tồn tại", string.Empty);
                        return objResultMessage;
                    }

                    Prize.IsDeleted = true;
                    Prize.DeletedDate = DateTime.Now;

                    db.SaveChanges();
                }
                DataCache.ClearDataCache.PrizeCache();
                DAL_Event.Insert("Xóa Xếp loại giải thưởng - " + objPrize.PrizeName.ToString(), 0, ResultMessage.ErrorTypes.Insert.ToString());

            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.Delete, "Lỗi xóa Xếp loại giải thưởng", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Prize --> DeleteNoCheck");
                return objResultMessage;
            }
            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Xóa Xếp loại giải thưởng thành công", string.Empty);
        }

        #endregion

        #region Load/Search/Select

        /// <summary>
        /// Lấy thông tin Xếp loại giải thưởng
        /// </summary>
        /// <param name="objPrize"></param>
        /// <param name="strIDSys"></param>
        /// <returns></returns>
        public ResultMessage LoadInfo(ref LIS_Prize objPrize, int strIDSys)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    var Prize = from gu in db.LIS_Prizes
                                   where gu.IDSys == strIDSys
                                   select gu;
                    objPrize = new LIS_Prize();
                    foreach (var obj in Prize)
                    {
                        if (!Convert.IsDBNull(obj.IDSys)) objPrize.IDSys = obj.IDSys;
                        if (!string.IsNullOrEmpty(obj.PrizeName)) objPrize.PrizeName = obj.PrizeName;
                        if (!Convert.IsDBNull(obj.StepIncrease)) objPrize.StepIncrease = obj.StepIncrease;
                        if (!Convert.IsDBNull(obj.AwardValue)) objPrize.AwardValue = obj.AwardValue;
                        if (!Convert.IsDBNull(obj.TournamentIDSys)) objPrize.TournamentIDSys = obj.TournamentIDSys;
                        if (!Convert.IsDBNull(obj.TournamentStepIDSys)) objPrize.TournamentStepIDSys = obj.TournamentStepIDSys;
                        if (!string.IsNullOrEmpty(obj.Note)) objPrize.Note = obj.Note;
                        if (!Convert.IsDBNull(obj.OrderIndex)) objPrize.OrderIndex = obj.OrderIndex;
                        if (!Convert.IsDBNull(obj.IsDeleted)) objPrize.IsDeleted = obj.IsDeleted;
                        if (!Convert.IsDBNull(obj.DeletedDate)) objPrize.DeletedDate = obj.DeletedDate;
                    }
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.LoadInfo, "Lấy thông tin Xếp loại giải thưởng", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Prize --> LoadInfo");
                return objResultMessage;
            }
            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy thông tin Xếp loại giải thưởng thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách Xếp loại giải thưởng
        /// </summary>
        /// <param name="dtPrize"></param>
        /// <returns></returns>
        public ResultMessage SearchData(ref DataTable dtPrize)
        {
            ResultMessage objResultMessage = new ResultMessage();
            dtPrize = new DataTable();

            try
            {
                using (PokerLife db = new PokerLife())
                {
                    dtPrize = ConvertData.ConvertToDataTable<LIS_Prize>(db.LIS_Prizes.Where(i => i.IsDeleted == false).ToList());
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SearchData, "Lấy thông tin Xếp loại giải thưởng", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Prize --> LoadInfo");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy danh sách Xếp loại giải thưởng thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách Xếp loại giải thưởng dạng LIST
        /// </summary>
        /// <param name="lstPrize"></param>
        /// <returns></returns>
        public ResultMessage SelectToList(ref List<LIS_Prize> lstPrize)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    var Prize = from b in db.LIS_Prizes
                                   where b.IsDeleted == false
                                   orderby b.OrderIndex
                                   select b;
                    lstPrize = Prize.ToList();
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SelectData, "Lấy thông tin Xếp loại giải thưởng", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Prize --> LoadInfo");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy danh sách Xếp loại giải thưởng thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách Xếp loại giải thưởng dạng List
        /// </summary>
        /// <param name="lstUserGroup">Đối tượng Xếp loại giải thưởng</param>
        /// <param name="intPageSize">Số lượng Record một trang</param>
        /// <param name="intPageNumber">Lấy trang số mấy</param>
        /// <returns></returns>
        public ResultMessage SelectToList(ref List<LIS_Prize> lstPrize, int intPageSize, int intPageNumber)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {
                    var Prize = from gu in db.LIS_Prizes
                                   where gu.IsDeleted == false
                                   orderby gu.OrderIndex
                                   select gu;

                    lstPrize = Prize.Skip((intPageNumber - 1) * intPageSize).Take(intPageSize).ToList();
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SelectData, "Lấy thông tin Xếp loại giải thưởng", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Prize --> SelectToList");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy danh sách Xếp loại giải thưởng thành công", string.Empty);
        }

        /// <summary>
        /// Lấy danh sách Xếp loại giải thưởng từ Cache
        /// </summary>
        /// <param name="lstPrize"></param>
        /// <returns></returns>
        public ResultMessage SelectToListCache(ref List<LIS_Prize> lstPrize)
        {
            ResultMessage objResultMessage = new ResultMessage();
            objResultMessage = DataCache.GetDataCache.GetPrize(ref lstPrize);
            return objResultMessage;
        }

        public ResultMessage SelectListToCache(ref List<LIS_Prize> lstPrize)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {

                    IEnumerable<LIS_Prize> Prize = (from gu in db.LIS_Prizes
                                                          where gu.IsDeleted == false
                                                          orderby gu.OrderIndex
                                                          select new
                                                          {
                                                              IDSys = gu.IDSys,
                                                              PrizeName = gu.PrizeName,
                                                              gu.StepIncrease,
                                                              gu.AwardValue,
                                                              gu.TournamentIDSys,
                                                              gu.TournamentStepIDSys,
                                                              Note = gu.Note,
                                                              OrderIndex = (Nullable<int>)gu.OrderIndex
                                                          }).ToList().Select(c => new LIS_Prize()
                                                          {
                                                              IDSys = c.IDSys,
                                                              PrizeName = c.PrizeName,
                                                              StepIncrease = c.StepIncrease,
                                                              TournamentIDSys=c.TournamentIDSys,
                                                              TournamentStepIDSys=c.TournamentStepIDSys,
                                                              Note = c.Note,
                                                              OrderIndex = (Nullable<int>)c.OrderIndex == null ? 0 : 0
                                                          });

                    lstPrize = Prize.ToList();
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SelectData, "Lấy Cache danh sách Xếp loại giải thưởng", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Prize --> SelectToListCache");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy Cache danh sách Xếp loại giải thưởng thành công", string.Empty);
        }

        /// <summary>
        /// Lấy những thông tin Xếp loại giải thưởng để Cache
        /// </summary>
        /// <param name="lstPrize"></param>
        /// <returns></returns>
        public ResultMessage SelectToCache(ref List<LIS_Prize> lstPrize)
        {
            ResultMessage objResultMessage = new ResultMessage();
            try
            {
                using (PokerLife db = new PokerLife())
                {

                    IEnumerable<LIS_Prize> Prize = (from gu in db.LIS_Prizes
                                                          where gu.IsDeleted == false
                                                          orderby gu.OrderIndex
                                                          select new
                                                          {
                                                              IDSys = gu.IDSys,
                                                              PrizeName = gu.PrizeName,
                                                              gu.StepIncrease,
                                                              gu.AwardValue,
                                                              gu.TournamentIDSys,
                                                              gu.TournamentStepIDSys,
                                                              Note = gu.Note,
                                                              OrderIndex = (Nullable<int>)gu.OrderIndex
                                                          }).ToList().Select(c => new LIS_Prize()
                                                          {
                                                              IDSys = c.IDSys,
                                                              PrizeName = c.PrizeName,
                                                              StepIncrease = c.StepIncrease,
                                                              AwardValue=c.AwardValue,
                                                              TournamentIDSys=c.TournamentIDSys,
                                                              TournamentStepIDSys=c.TournamentStepIDSys,
                                                              Note = c.Note,
                                                              OrderIndex = (Nullable<int>)c.OrderIndex == null ? 0 : 0
                                                          });

                    lstPrize = Prize.ToList();
                }
            }
            catch (Exception objEx)
            {
                objResultMessage = new ResultMessage(true, ResultMessage.ErrorTypes.SelectData, "Lấy Cache danh sách Xếp loại giải thưởng", objEx);
                DAL_Error.Insert(objResultMessage, 0, "DAL_Prize --> SelectToListCache");
                return objResultMessage;
            }

            return new ResultMessage(false, ResultMessage.ErrorTypes.No_Error, "Lấy Cache danh sách Xếp loại giải thưởng thành công", string.Empty);
        }

        #endregion
    }
}
